package org.example.demo;

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class SqlValidator {

    public static String validate(String sql) {
        sql = sql.toLowerCase().trim();

        if (sql.contains("drop ") || sql.contains("truncate ")) {
            return "禁止使用 DROP 或 TRUNCATE 语句";
        }

        if (sql.startsWith("select") && !sql.contains("from")) {
            return "SELECT 语句缺少 FROM 子句";
        }

        if (sql.startsWith("update") && !sql.contains("set")) {
            return "UPDATE 语句缺少 SET 子句";
        }

        if (sql.startsWith("insert") && !sql.contains("values")) {
            return "INSERT 语句缺少 VALUES 子句";
        }

        return null;
        // 无错误
    }


    public static String formatSQL(String xmlSql) {
        if (xmlSql == null || xmlSql.trim().isEmpty()) {
            return "";
        }

        String sql = xmlSql.trim();

        // 1. 移除注释（可选）
        sql = sql.replaceAll("<!--[^-->]*-->", "");

        // 2. 替换所有 #{...} 和 ${...} 为 -1
        sql = sql.replaceAll("#\\{[^}]+}", "'-1'");
        sql = sql.replaceAll("\\$\\{[^}]+}", "'-1'");

        // 3. 处理 <if test="..."> ... </if>：直接保留内容（模拟条件为 true）
        Pattern ifPattern = Pattern.compile("<if[^>]*>(.*?)</if>", Pattern.DOTALL);
        Matcher ifMatcher = ifPattern.matcher(sql);
        StringBuffer sb = new StringBuffer();
        while (ifMatcher.find()) {
            ifMatcher.appendReplacement(sb, Matcher.quoteReplacement(ifMatcher.group(1).trim()));
        }
        ifMatcher.appendTail(sb);
        sql = sb.toString();

        // 4. 处理 <foreach>：提取内容，用 -1 替代，并拼接
        Pattern foreachPattern = Pattern.compile("<foreach[^>]*>(.*?)</foreach>", Pattern.DOTALL);
        Matcher foreachMatcher = foreachPattern.matcher(sql);
        sb = new StringBuffer();
        while (foreachMatcher.find()) {
            String content = foreachMatcher.group(1).trim();
            // 简单模拟：假设循环一次，内容中 #{...} 已被替换为 -1
            String simulated = "'-1'";
            // 可以改为 " -1, -1 " 多个值测试
            foreachMatcher.appendReplacement(sb, Matcher.quoteReplacement(simulated));
        }
        foreachMatcher.appendTail(sb);
        sql = sb.toString();

        // 5. 处理 <where>：移除标签，保留内容，如果开头有 AND/OR 则去掉
        sql = sql.replaceAll("<where>\\s*", "");
        sql = sql.replaceAll("</where>", "");
//        sql = sql.replaceAll("(?i)\\b(where)\\s+", "");
        // 清理残留的 where
        sql = sql.replaceAll("^\\s*(AND|OR)\\s+", "");
        // 去掉开头的 AND/OR

        // 6. 处理 <set> （update 用）
        sql = sql.replaceAll("<set>\\s*", "");
        sql = sql.replaceAll("</set>", "");
        sql = sql.replaceAll("^\\s*(,\\s*)+", "");
        // 去掉开头的逗号

        // 7. 移除其他标签（trim, choose, when 等）
        sql = sql.replaceAll("<[^>]+>", " ");
        sql = sql.replaceAll("\\s+", " ");
        // 多空格变单空格
        sql = sql.trim();

        return sql;
    }
}